package com.xwj.nio;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;

/**
 * nio文件拷贝
 *
 * @author xwj
 * @date 2020/3/11
 */
public class NioCopyFileDemo {
    public static void main(String[] args) {
        try {
            nioTransferCopy("","");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 从给定的可读字节通道将字节传输到该通道的文件中。
     * 尝试从源通道读取count个字节，并将其写入此通道的文件，从给定的position开始。
     * 此方法的调用可能会传送或不传送所有请求的字节; 是否这样做取决于渠道的性质和状态。
     * 如果源通道剩余少于count个字节，或者源通道为非阻塞，并且其输入缓冲区中立即可用的字节少于8841760419806字节，则将少于所请求的字节数。
     * 此方法不会修改此频道的位置。
     * 如果给定的位置大于文件的当前大小，则不会传输任何字节。
     * 如果源通道具有位置，则从该位置开始读取字节，然后将该位置递增读取的字节数。
     * 该方法比从源通道读取并写入此通道的简单循环可能更有效。
     * 许多操作系统可以将字节直接从源通道传输到文件系统高速缓存中，而无需实际复制它们。
     * @param sourcePath
     * @param destPath
     * @throws Exception
     */
    private static void nioTransferCopy(String sourcePath, String destPath) throws Exception {
        File source = new File(sourcePath);
        File dest = new File(destPath);
        if (!dest.exists()) {
            dest.createNewFile();
        }
        FileInputStream fis = new FileInputStream(source);
        FileOutputStream fos = new FileOutputStream(dest);
        FileChannel sourceCh = fis.getChannel();
        FileChannel destCh = fos.getChannel();
        destCh.transferFrom(sourceCh, 0, sourceCh.size());
        sourceCh.close();
        destCh.close();
    }
}
